package com.jcxh.sg_exam.controller;

import com.alibaba.excel.EasyExcel;
import com.jcxh.sg_exam.listener.*;
import com.jcxh.sg_exam.pojo.*;
import com.jcxh.sg_exam.service.*;
import com.jcxh.sg_exam.utils.RedisCacheService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author 鹏少
 * @Date 2024/8/8
 * @Date 10:58
 */
@RestController
@RequestMapping("admin/import")
@Api(tags = "导入接口")
@Slf4j
public class ImportController {

    @Autowired
    private UserService userService;

    @Autowired
    private DanxuanService danxuanService;

    @Autowired
    private DuoxuanService duoxuanService;

    @Autowired
    private PanduanService panduanService;

    @Autowired
    private ShicaoService shicaoService;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private RedisCacheService redisCacheService;
    /**
     * 人员信息导入
     *
     * @param file 上传的文件
     * @return 导入结果
     * @throws IOException
     */
    @Transactional(rollbackFor = Exception.class)
    @ApiOperation(value = "人员信息导入")
    @PostMapping("/users")
    public Result messageImport(
            @ApiParam(value = "MultipartFile类型的文件 文件名file")
            @RequestParam("file") MultipartFile file) {
        // 检查文件类型
        String fileName = file.getOriginalFilename();
        if (fileName == null || !fileName.endsWith(".xlsx")) {
            return Result.error("仅支持.xlsx格式的文件");
        }

        try {
            // 使用 EasyExcel 读取文件内容
            EasyExcel.read(file.getInputStream(), User.class, new UploadDataListener(userService,redisCacheService)).sheet().doRead();
            return Result.success("导入成功");

        } catch (Exception e) {
            log.error("导入失败: {}", e.getMessage(), e);
            return Result.error("导入失败");
        }
    }

    /**
     * 单选题信息导入
     *
     * @param file
     * @return
     * @throws IOException
     */
    @Transactional(rollbackFor = Exception.class)
    @ApiOperation(value = "单选题信息导入")
    @PostMapping("/danxuan")
    public Result danxuanImport(@ApiParam(value = "MultipartFile类型的文件 文件名file") @RequestParam("file") MultipartFile file) {
        // 检查文件类型
        String fileName = file.getOriginalFilename();
        if (fileName == null || !fileName.endsWith(".xlsx")) {
            return Result.error("仅支持.xlsx格式的文件");
        }

        try {
            EasyExcel.read(file.getInputStream(), Danxuan.class, new DanxuanListener(danxuanService)).sheet().doRead();

            // 清空 Redis 中的 List
            redisTemplate.delete("danXuan");

            // 从数据库中获取数据并存入 Redis
            List<Danxuan> danxuanList = danxuanService.lambdaQuery().list();
            redisTemplate.opsForList().rightPushAll("danXuan", danxuanList);

            return Result.success("导入成功");
        } catch (Exception e) {
            log.info("{}", e.getMessage());
            return Result.error("导入失败");
        }

    }

    /**
     * 多选题信息导入
     *
     * @param file
     * @return
     * @throws IOException
     */
    @Transactional(rollbackFor = Exception.class)
    @ApiOperation(value = "多选题信息导入")
    @PostMapping("/duoxuan")
    public Result duoxuanImport(@ApiParam(value = "MultipartFile类型的文件 文件名file") @RequestParam("file") MultipartFile file) {

        // 检查文件类型
        String fileName = file.getOriginalFilename();
        if (fileName == null || !fileName.endsWith(".xlsx")) {
            return Result.error("仅支持.xlsx格式的文件");
        }

        try {
            EasyExcel.read(file.getInputStream(), Duoxuan.class, new DuoxuanListener(duoxuanService)).sheet().doRead();
            // 清空 Redis 中的 List
            redisTemplate.delete("duoXuan");

            // 从数据库中获取数据并存入 Redis
            List<Duoxuan> duoxuanList = duoxuanService.lambdaQuery().list();
            redisTemplate.opsForList().rightPushAll("duoXuan", duoxuanList);
            return Result.success("导入成功");
        } catch (Exception e) {
            log.info("{}", e.getMessage());
            return Result.error("导入失败");
        }

    }

    /**
     * 判断题信息导入
     *
     * @param file
     * @return
     * @throws IOException
     */
    @Transactional(rollbackFor = Exception.class)
    @ApiOperation(value = "判断题信息导入")
    @PostMapping("/panduan")
    public Result panduanImport(@ApiParam(value = "MultipartFile类型的文件 文件名file") @RequestParam("file") MultipartFile file) {
        // 检查文件类型
        String fileName = file.getOriginalFilename();
        if (fileName == null || !fileName.endsWith(".xlsx")) {
            return Result.error("仅支持.xlsx格式的文件");
        }

        try {
            EasyExcel.read(file.getInputStream(), Panduan.class, new PanduanListener(panduanService)).sheet().doRead();
            // 清空 Redis 中的 List
            redisTemplate.delete("panDuan");

            // 从数据库中获取数据并存入 Redis
            List<Panduan> panduanList = panduanService.lambdaQuery().list();
            redisTemplate.opsForList().rightPushAll("panDuan", panduanList);
            return Result.success("导入成功");
        } catch (Exception e) {
            log.info("{}", e.getMessage());
            return Result.error("导入失败");
        }

    }


    /**
     * 实操考题导入
     *
     * @param file
     * @return
     * @throws IOException
     */
    @Transactional(rollbackFor = Exception.class)
    @ApiOperation(value = "实操考题信息导入")
    @PostMapping("/shicao")
    public Result shicao(@ApiParam(value = "MultipartFile类型的文件 文件名file") @RequestParam("file") MultipartFile file) {
        // 检查文件类型
        String fileName = file.getOriginalFilename();
        if (fileName == null || !fileName.endsWith(".xlsx")) {
            return Result.error("仅支持.xlsx格式的文件");
        }

        try {
            EasyExcel.read(file.getInputStream(), Shicao.class, new ShicaoListener(shicaoService)).sheet().doRead();
            // 清空 Redis 中的 List
            redisTemplate.delete("shiCao");

            // 从数据库中获取数据并存入 Redis
            List<Shicao> shicaoList = shicaoService.lambdaQuery().list();
            redisTemplate.opsForList().rightPushAll("shiCao", shicaoList);
            return Result.success("导入成功");
        } catch (Exception e) {
            log.info("{}", e.getMessage());
            return Result.error("导入失败");
        }

    }
}
